package com.ydd.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.ydd.context.BaseContext;
import com.ydd.dto.QueryDTO;
import com.ydd.dto.YddArticleDTO;
import com.ydd.entity.YddArticle;
import com.ydd.entity.YddCate;
import com.ydd.entity.YddUserData;
import com.ydd.mapper.YddArticleMapper;
import com.ydd.mapper.YddCateMapper;
import com.ydd.mapper.YddUserDataMapper;

import com.ydd.service.IYddArticleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ydd.vo.ArticleCollectVO;
import com.ydd.vo.PageResultVO;
import com.ydd.vo.UserArticleDataInfoVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author itcast
 * @since 2023-05-15
 */
@Service
public class YddArticleServiceImpl extends ServiceImpl<YddArticleMapper, YddArticle> implements IYddArticleService {

    @Autowired
    private YddArticleMapper yddArticleMapper;

    @Autowired
    private YddCateMapper yddCateMapper;

    @Autowired
    private YddUserDataMapper yddUserDataMapper;
    /**
     * 获取我的文章
     *
     * @param queryDTO
     * @return
     */
    @Override
    public PageResultVO myArticle(QueryDTO queryDTO) {
        //执行分页
        PageHelper.startPage(Math.toIntExact(queryDTO.getPage()), Math.toIntExact(queryDTO.getLimit()));
        // 条件查询
        Page<YddArticle> page = yddArticleMapper.searchAll();
        //总数及集合
        long total = page.getTotal();   // 总条数
        long pages = page.getPages();  // 总页数
        List<YddArticle> result = page.getResult();




        return PageResultVO.builder()
                .count(total)
                .totalPage(pages)
                .currentPage(queryDTO.getPage()).data(result).build();
    }

    /**
     * 发布文章
     *
     * @param yddArticleDTO
     */
    @Override
    public void addArticle(YddArticleDTO yddArticleDTO) {
        YddArticle yddArticle = new YddArticle();
        // 属性拷贝
        BeanUtils.copyProperties(yddArticleDTO, yddArticle);

        // 设置用户id
        yddArticle.setUserId(Math.toIntExact(BaseContext.getCurrentId()));
        // 设置创建时间
        yddArticle.setCreateDate(System.currentTimeMillis());
        // 设置更新时间
        yddArticle.setUpdateDate(System.currentTimeMillis());
        // 设置Lovenum
        yddArticle.setLovenum("0");
        // 设置默认状态
        yddArticle.setDefaultData("1");



        // 保存文章
        yddArticleMapper.insert(yddArticle);
    }

    /**
     * 删除文章
     *
     * @param id
     */
    @Override
    public void delArticle(Integer id) {
        // 删除文章数据
        yddUserDataMapper.delete(new LambdaQueryWrapper<YddUserData>().eq(YddUserData::getArticleId, id));
        // 删除文章
        yddArticleMapper.deleteById(id);
    }

    /**
     * 编辑文章
     *
     * @param yddArticleDTO
     */
    @Override
    public void editArticle(YddArticleDTO yddArticleDTO) {
            YddArticle yddArticle = new YddArticle();
            // 属性拷贝
            BeanUtils.copyProperties(yddArticleDTO, yddArticle);

            // 设置用户id
            yddArticle.setUserId(BaseContext.getCurrentId().intValue());
            // 设置更新时间
            yddArticle.setUpdateDate(System.currentTimeMillis());

            // 保存文章
            yddArticleMapper.updateById(yddArticle);
    }

    /**
     * 获取我的点赞/收藏
     *
     * @param type
     * @param queryDTO
     * @return
     */
    @Override
    public UserArticleDataInfoVo userDataList(Integer type, QueryDTO queryDTO) {
        // 获取我的点赞/收藏
        LambdaQueryWrapper<YddUserData> lqw = new LambdaQueryWrapper<>();
        lqw.select(YddUserData::getArticleId).eq(YddUserData::getUserId, 136).eq(YddUserData::getType, type);
        // 文章列表
        List<YddUserData> articleIdList = yddUserDataMapper.selectList(lqw);
        // 转换成文章id集合
        List<Integer> articleIds = articleIdList.stream().map(YddUserData::getArticleId).collect(Collectors.toList());

//        Page<YddArticle> page = new Page<>(queryDTO.getPage(), queryDTO.getLimit());
        // 分页查询
       PageHelper.startPage(Math.toIntExact(queryDTO.getPage()), Math.toIntExact(queryDTO.getLimit()));
       // 条件查询
        Page<YddArticle> page = yddArticleMapper.searchAll();
        // 总条数及集合
        long total = page.getTotal();
        long pages = page.getPages();
        List<YddArticle> result = page.getResult();

        // 转换成vo
        List<ArticleCollectVO> articleCollectVOS = result.stream().map(article -> {
            ArticleCollectVO articleCollectVO = new ArticleCollectVO();
            // 属性拷贝
            BeanUtils.copyProperties(article, articleCollectVO);
            // 根据cateid查询分类名称
            YddCate yddCate = yddCateMapper.selectOne(new LambdaQueryWrapper<YddCate>().select(YddCate::getCatename)
                    .eq(YddCate::getId, article.getCateid()));
            articleCollectVO.setCatename(yddCate.getCatename());
            return articleCollectVO;
        }).collect(Collectors.toList());


        return UserArticleDataInfoVo.builder()
                .list(PageResultVO.builder().count(page.getTotal())
                        .totalPage(total).pageSize(pages)
                        .currentPage(queryDTO.getPage()).data(articleCollectVOS).build())
                .build();
    }




}
